package com.mallify.service.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import com.mallify.common.model.user.User;
import com.mallify.common.request.*;
import com.mallify.common.response.TopDetail;
import com.mallify.common.response.UserResponse;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 用户表 服务类
 * +----------------------------------------------------------------------
 * | HANSON [ HANSON赋能开发者，助力企业发展 ]
 * +----------------------------------------------------------------------
 * | Licensed HANSON并不是自由软件，未经许可不能去掉HANSON相关版权
 * +----------------------------------------------------------------------
 * | Author: HANSON Team <hanson0622@126.com>
 * +----------------------------------------------------------------------
 */
public interface UserService extends IService<User> {

    /**
     * 根据日期获取注册用户数量
     *
     * @param date 日期
     * @return Integer
     */
    Integer getRegisterNumByDate(String date);

    Map<Object, Object> getAddUserCountGroupDate(String date);

    /**
     * 用户分页列表
     *
     * @param request          查询参数
     * @param pageParamRequest 分页参数
     * @return PageInfo
     */
    PageInfo<UserResponse> getList(UserSearchRequest request, PageParamRequest pageParamRequest);

    /**
     * 更新用户
     *
     * @param userRequest 用户参数
     */
    Boolean updateUser(UserUpdateRequest userRequest);

    /**
     * 后台修改用户手机号
     *
     * @param id    用户uid
     * @param phone 手机号
     * @return Boolean
     */
    Boolean updatePhone(Integer id, String phone);

    /**
     * 根据手机号查询用户
     *
     * @param phone 用户手机号
     * @return 用户信息
     */
    User getByPhone(String phone);

    /**
     * 获取用户详情
     *
     * @param id 用户uid
     */
    User getInfoByUid(Integer id);

    /**
     * 根据参数类型查询会员对应的信息
     *
     * @param userId           Integer 会员id
     * @param type             int 类型 0=消费记录，1=积分明细，2=签到记录，3=持有优惠券，4=余额变动，5=好友关系
     * @param pageParamRequest PageParamRequest 分页
     */
    Object getInfoByCondition(Integer userId, Integer type, PageParamRequest pageParamRequest);

    /**
     * 根据昵称匹配用户，返回id集合
     *
     * @param nikeName 需要匹配得昵称
     * @return List
     */
    List<Integer> findIdListLikeName(String nikeName);

    /**
     * 会员详情页Top数据
     *
     * @param userId 用户uid
     * @return TopDetail
     */
    TopDetail getTopDetail(Integer userId);

    /**
     * 操作积分、余额
     */
    Boolean updateIntegralMoney(UserOperateIntegralMoneyRequest request);

    /**
     * 添加/扣减余额
     *
     * @param uid      用户id
     * @param price    金额
     * @param nowMoney 历史金额
     * @param type     类型：add—添加，sub—扣减
     */
    Boolean operationNowMoney(Integer uid, BigDecimal price, BigDecimal nowMoney, String type);

    /**
     * 添加/扣减积分
     *
     * @param uid         用户id
     * @param integral    积分
     * @param nowIntegral 历史积分
     * @param type        类型：add—添加，sub—扣减
     */
    Boolean operationIntegral(Integer uid, Integer integral, Integer nowIntegral, String type);

    /**
     * 会员分组
     * @param id String id
     * @param groupId Integer 分组Id
     */
    Boolean group(String id, String groupId);

    /**
     * 会员标签
     *
     * @param id         String id
     * @param tagId Integer 标签Id
     */
    Boolean tag(String id, String tagId);

    /**
     * 更新推广人
     * @param request 请求参数
     * @return Boolean
     */
    Boolean editSpread(UserUpdateSpreadRequest request);

    /**
     * 更新用户会员等级
     * @param request request
     * @return Boolean
     */
    Boolean updateUserLevel(UpdateUserLevelRequest request);

    /**
     * 清除User Group id
     * @param groupId 待清除的GroupId
     */
    void clearGroupByGroupId(String groupId);

    /**
     * 清除User Tag id
     * @param tagId 待清除的tagId
     */
    void clearTagByTagId(String tagId);
}
